#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Python后端服务 - 用于执行EMS爬虫脚本
"""

import json
import subprocess
import sys
import os
from flask import Flask, request, jsonify
from flask_cors import CORS
import traceback

app = Flask(__name__)
CORS(app)  # 允许跨域请求

@app.route('/run-scraper', methods=['POST'])
def run_scraper():
    """执行爬虫脚本"""
    try:
        data = request.get_json()
        script_name = data.get('script', 'japanpost_ems_scraper_working.py')
        
        print(f"开始执行爬虫脚本: {script_name}")
        
        # 检查脚本文件是否存在
        if not os.path.exists(script_name):
            return jsonify({
                'success': False,
                'message': f'脚本文件不存在: {script_name}',
                'data': None
            }), 400
        
        # 执行Python脚本
        result = subprocess.run(
            [sys.executable, script_name],
            capture_output=True,
            text=True,
            cwd=os.getcwd()
        )
        
        if result.returncode == 0:
            print("爬虫脚本执行成功")
            
            # 尝试读取生成的数据文件
            data_file = 'japanpost_ems_prices.json'
            if os.path.exists(data_file):
                try:
                    with open(data_file, 'r', encoding='utf-8') as f:
                        scraped_data = json.load(f)
                    
                    # 转换数据格式
                    transformed_data = transform_scraped_data(scraped_data)
                    
                    return jsonify({
                        'success': True,
                        'message': '爬虫脚本执行成功，数据已更新',
                        'data': transformed_data,
                        'script_output': result.stdout
                    })
                except Exception as e:
                    print(f"读取数据文件失败: {e}")
                    return jsonify({
                        'success': True,
                        'message': '爬虫脚本执行成功，但读取数据文件失败',
                        'data': None,
                        'script_output': result.stdout
                    })
            else:
                return jsonify({
                    'success': True,
                    'message': '爬虫脚本执行成功，但未找到数据文件',
                    'data': None,
                    'script_output': result.stdout
                })
        else:
            print(f"爬虫脚本执行失败: {result.stderr}")
            return jsonify({
                'success': False,
                'message': f'爬虫脚本执行失败: {result.stderr}',
                'data': None,
                'script_output': result.stdout,
                'script_error': result.stderr
            }), 500
            
    except Exception as e:
        print(f"执行爬虫脚本时发生错误: {e}")
        traceback.print_exc()
        return jsonify({
            'success': False,
            'message': f'执行爬虫脚本时发生错误: {str(e)}',
            'data': None
        }), 500

def transform_scraped_data(scraped_data):
    """转换爬取的数据格式"""
    try:
        # 定义区域信息
        zones = [
            {
                'name': '第1区',
                'description': '中国、韩国、台湾',
                'example': '最优惠价格',
                'color': '#67C23A'
            },
            {
                'name': '第2区',
                'description': '亚洲其他地区',
                'example': '价格适中',
                'color': '#E6A23C'
            },
            {
                'name': '第3区',
                'description': '欧洲、大洋洲、加拿大、墨西哥、中近东',
                'example': '价格较高',
                'color': '#F56C6C'
            },
            {
                'name': '第4区',
                'description': '美国（包括关岛等海外领土）',
                'example': '价格最高',
                'color': '#909399'
            },
            {
                'name': '第5区',
                'description': '中南美（墨西哥除外）、非洲',
                'example': '价格较高',
                'color': '#9C27B0'
            }
        ]
        
        # 转换运费数据
        freight_data = []
        for item in scraped_data:
            if 'weight' in item and 'prices' in item:
                freight_data.append({
                    'weight': item['weight'],
                    'weight_text': item.get('weight_text', f'不超过{item["weight"]}kg'),
                    'prices': item['prices']
                })
        
        return {
            'zones': zones,
            'freightData': freight_data
        }
        
    except Exception as e:
        print(f"转换数据格式失败: {e}")
        return None

@app.route('/health', methods=['GET'])
def health_check():
    """健康检查"""
    return jsonify({
        'status': 'healthy',
        'message': 'Python后端服务运行正常'
    })

@app.route('/scripts', methods=['GET'])
def list_scripts():
    """列出可用的脚本文件"""
    try:
        scripts = [f for f in os.listdir('.') if f.endswith('.py') and 'scraper' in f.lower()]
        return jsonify({
            'success': True,
            'scripts': scripts
        })
    except Exception as e:
        return jsonify({
            'success': False,
            'message': f'获取脚本列表失败: {str(e)}'
        }), 500

if __name__ == '__main__':
    print("启动Python后端服务...")
    print("服务地址: http://localhost:5001")
    print("可用接口:")
    print("  POST /run-scraper - 执行爬虫脚本")
    print("  GET  /health      - 健康检查")
    print("  GET  /scripts     - 列出可用脚本")
    
    app.run(host='0.0.0.0', port=5001, debug=True)
